import type {MenuProvider, SubMenuProvider} from '../types';

import {getCurrentInstance, inject, provide} from 'vue';

import {findComponentUpward} from '../utils';

const menuContextKey = Symbol('menuContext');

/**
 * @zh_CN Provide menu context
 */
function createMenuContext(injectMenuData: MenuProvider) {
    provide(menuContextKey, injectMenuData);
}

/**
 * @zh_CN Provide menu context
 */
function createSubMenuContext(injectSubMenuData: SubMenuProvider) {
    const instance = getCurrentInstance();

    provide(`subMenu:${instance?.uid}`, injectSubMenuData);
}

/**
 * @zh_CN Inject menu context
 */
function useMenuContext() {
    const instance = getCurrentInstance();
    if (!instance) {
        throw new Error('instance is required');
    }
    const rootMenu = inject(menuContextKey) as MenuProvider;
    return rootMenu;
}

/**
 * @zh_CN Inject menu context
 */
function useSubMenuContext() {
    const instance = getCurrentInstance();
    if (!instance) {
        throw new Error('instance is required');
    }
    const parentMenu = findComponentUpward(instance, ['Menu', 'SubMenu']);
    const subMenu = inject(`subMenu:${parentMenu?.uid}`) as SubMenuProvider;
    return subMenu;
}

export {
    createMenuContext,
    createSubMenuContext,
    useMenuContext,
    useSubMenuContext,
};
